///
/// Sistemas Gr�ficos - 6671
/// 1er cuatrimestre 2009
///
#include "GL/glut.h"
#include <stdlib.h>
#include <iostream>
#include "Matriz3D.h"
#include "Linea.h"
#include "../modelo/Celular.h"
#include "Viewport.h"
#include "Clipper.h"
#include "Definiciones.h"
#include <cmath>

char caption[] = "Sistema Graficos - 66.71 - 2009c1";
static Celular celu;

Matriz3D espejo, tras, escala;
Matriz3D vista;

Viewport ventanaRecorte(800, 600, Punto(00, 00));
Viewport vistaPantalla(800, 600, Punto(00, 00));
Viewport ventanaEscena(800,600,Punto(0,0));
void reshape(int w, int h) {
	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0.0, (GLdouble) w, (GLdouble) h, 0.0);
}

void init(void) {
	glClearColor(1.0, 1.0, 1.0, 1.0);
}

float elmayor(float a, float b) {
	return (a > b) ? a : b;
}
float elmenor(float a, float b) {
	return (a < b) ? a : b;
}

Matriz3D matVista(){
	Matriz3D m;
	float ax = (((float)(LimDer - LimIzq))/(ventanaEscena.getWidth() - (ventanaEscena.getPosition().x())));
	float ay =( ((float)(LimSup - LimInf)) / (ventanaEscena.getHeight() - ventanaEscena.getPosition().y()));
	float bx = (-ax*ventanaEscena.getPosition().x() + LimIzq);
	float by = (-ay*ventanaEscena.getPosition().y() + LimInf);
	m.setIdentidad();
	m[0][0]= ax;
	m[1][1]= ay;
	m[0][3]= bx;
	m[1][3]= by;
	return m;
}

void display(void) {
	///
	glClear(GL_COLOR_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	Matriz3D m = matVista();
	Matriz3D* r = m*vista;
	celu.pintar(*r);
	glutSwapBuffers();
	usleep(500000);
	delete r;

}

void ArrowKey(int key, int x, int y) {
	switch (key) {
	case GLUT_KEY_RIGHT:
		ventanaEscena.mover(RIGHT);
		break;
	case GLUT_KEY_LEFT:
		ventanaEscena.mover(LEFT);
		break;
	case GLUT_KEY_UP:
		ventanaEscena.mover(UP);
		break;
	case GLUT_KEY_DOWN:
		ventanaEscena.mover(DOWN);
		break;
	}

}
/* x, y coordenadas mouse cuando se presiona key */
void keyboard(unsigned char key, int x, int y) {
	int num = (key - '0');
	if (num >= 0 && num < 10) {
		celu.presionarBoton(num);
	} else {
		switch (key) {
		case 0x1b:
			exit(1);
			break;
		case '+':
			ventanaEscena.zoom(-0.10);
			break;
		case '-':
			ventanaEscena.zoom(0.10);
			break;
		case 'B':
		case 'b': Linea::setMetodoDibujo('B');
		break;
		case 'D':
		case 'd': Linea::setMetodoDibujo('D');
		break;
		}
	}
	ventanaEscena.mostrar();
}

void onidle(void) {
	glutPostRedisplay();
}

int main(int argc, char** argv) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowSize(ANCHO, ALTO);
	glutInitWindowPosition(100, 100);
	glutCreateWindow(caption);
	init();

	glutKeyboardFunc(keyboard);
	glutSpecialFunc(ArrowKey);
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutIdleFunc(onidle);
	espejo.setEspejo();
	tras.setTraslacion(Punto(0, -ALTO));
	Matriz3D *R;
	R= espejo*tras;
	vista = *R;
	glutMainLoop();

	delete R;
	return 0;
}

